<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      // 原型：prototype

      // 1.原型是一个对象
      //   function Person(name,age){
      //       this.name = name;
      //       this.age = age;
      //   }
      // Person.prototype.fn = function(){
      //     console.log("fn");
      // }
      // Person.prototype.fn2 = function(){
      //     console.log("fn2");
      // }

      // console.log(typeof Person.prototype);

      // 2.2种原型 ：显示原型（实例化之前） 和隐式原型（实例化之后）[[Prototype]] -->__proto__：
      // __proto__获取或者设置实例化之后的原型，不推荐；
      // _this  _str :一般是私有属性；
      function Person(name, age) {
        this.name = name;
        this.age = age;
      }
      // // 构造函数里的原型被称为显示原型；
      Person.prototype.fn = function () {
        console.log("fn");
      };
      Person.prototype.fn2 = function () {
        console.log("fn2");
      };

      let zhangsan = new Person("张三", 20);
      // 要获取隐式原型；
      var res = Object.getPrototypeOf(zhangsan);
      console.log(res);
      // 设置隐式原型；
      Object.setPrototypeOf(zhangsan, { height: "178cm" });
      console.log(zhangsan);

      console.log(Person.prototype === zhangsan.__proto__);

      // zhangsan.__proto__.fn3 = function(){
      //     console.log("fn3")
      // }
      // console.log(zhangsan);

      // 3.对象是由 自身属性和方法 + 原型的属性和方法共同构成；

    //   function Person(name, age) {
    //     this.name = name;
    //     this.age = age;
    //   }
      // 构造函数里的原型被称为显示原型；
    //   Person.prototype.fn = function () {
    //     console.log("fn");
    //   };
    //   Person.prototype.fn2 = function () {
    //     console.log("fn2");
    //   };

    //   let zhangsan = new Person("张三", 20);
      // console.log(zhangsan);

    //   zhangsan.fn();
    //   zhangsan.fn2();
      console.log(Object.prototype); //内置构造函数的原型
      console.log(Object.prototype.__proto__); //内置构造函数的原型的原型 是null
    </script>
  </body>
</html>
